#ifndef FORMULAEVALUATOR_H
#define FORMULAEVALUATOR_H

//公式类 管理所有公式编辑功能
#include <QObject>
#include <QMap>
#include <QRegularExpression>
#include <QVariant>
#include <QDebug>
#include <cmath>

class SpreadsheetModel; // 前向声明

class FormulaEvaluator : public QObject
{
    Q_OBJECT

public:
    //初始化函数
    explicit FormulaEvaluator(SpreadsheetModel* model, QObject* parent = nullptr);//初始化公式计算器

    QVariant evaluate(const QString& formula, int row, int col)const;// 计算给定公式的值

    //工具函数
    bool isFormula(const QString& text) const;//判断是否为公式（字符串是否以 = 开头）
    QString getCellReference(int row, int col) const;//将行列索引转换为单元格引用
    void parseCellReference(const QString& ref, int& row, int& col) const;//解析单元格引用为行列索引
    void registerFunction(const QString& name, std::function<QVariant(const QVector<QVariant>&)> func);//注册自定义函数
    QVariant convertToNumberIfPossible(const QVariant &value)const;// 尝试将值转换为数字
    QVector<QVariant> getRangeValues(const QString& from, const QString& to, int currentRow, int currentCol)const;//获取范围值
private:
    //辅助函数
    QVariant evaluateExpression(const QString& expr, int currentRow, int currentCol)const;//解析并计算表达式
    QVariant evaluateFunction(const QString& funcName, const QString& args, int currentRow, int currentCol)const;//调用注册的函数
    QVariant evaluateRange(const QString& range, int currentRow, int currentCol)const;//处理单元格范围
    QVariant evaluateArithmeticExpression(const QString& expr, int currentRow, int currentCol)const;//处理运算符表达式

    //成员变量
    SpreadsheetModel* m_model;//模型
    QMap<QString, std::function<QVariant(const QVector<QVariant>&)>> m_functions;// 存储注册的函数

    //正则表达式
    static const QRegularExpression cellRefRegex;// 匹配单元格引用
    static const QRegularExpression functionRegex;// 匹配函数调用
    static const QRegularExpression rangeRegex;// 匹配范围
    static const QRegularExpression arithmeticRegex;//匹配运算符
};

#endif // FORMULAEVALUATOR_H
